<?php

/**
 * Description of saekvclient
 * @see https://gitee.com/foglede
 * @copyright mahuohuo.com
 * @author mahuohuo
 * 5
 */
class SaeKVClient /* * extends Redis * */ {//太多方法了，而且都要重写好麻烦啊。
//    /**
//     * 空KEY前缀
//     */
//    const EMPTY_PREFIXKEY  = '';
// 
//    /**
//     * pkrget获取的最大KEY个数
//     */
//    const MAX_PKRGET_SIZE  = 100;
// 
//    /**
//     * KEY的最大长度
//     */
//    const MAX_KEY_LENGTH   = 256;
// 
//    /**
//     * VALUE的最大长度
//     */
//    const MAX_VALUE_LENGTH = 4194304;    

    /**
     * 构造函数
     */

    private static $redis = null;

    function __construct() {
        if (!(self::$redis instanceof Redis)) { // && is_callable(self::$redis)
            self::$redis = new Redis();
            self::$redis->select(5);
        }
    }

    function __destruct() {
        if (is_callable(self::$redis)) {
            self::$redis->close();
        }
    }

    /**
     * 初始化Sae KV 服务
     *
     * @return bool 
     */
    function init() {
        return self::$redis->pconnect('127.0.0.1', 6379);
    }

    /**
     * 获得key对应的value
     *
     * @param string $key 长度小于256字节
     * @return string|bool成功返回value值，失败返回false
     */
    function get($key) {
        return self::$redis->get($key);
    }

    /**
     * 更新key对应的value
     *
     * @param string $key 长度小于256字节
     * @param string $value 长度小于4MB
     * @return bool 成功返回true，失败返回false
     */
    function set($key, $value) {
        return self::$redis->set($key, $value);
    }

    /**
     * 删除key-value
     *
     * @param string $key 长度小于256字节
     * @return bool 成功返回true，失败返回false
     */
    function delete($key) {
        return self::$redis->delete((String) $key);
    }

    /**
     * 批量获得key-values
     * 此方法跟SAE返回不同
     * @param array $ary 一个包含多个key的数组，数组长度小于等于32
     * @return array|bool成功返回key-value数组，失败返回false
     */
    function mget($ary = array()) {
        if (!count($ary) > 32) {
            return FALSE;
        }
        return array_combine(array_flip($ary), self::$redis->getMultiple($ary));
    }

    /**
     * 前缀范围查找key-values
     * 
     * @param string $prefix_key 前缀，长度小于256字节
     * @param int $count 前缀查找最大返回的key-values个数，小于等于100
     * @param string $start_key 最小key，在执行前缀查找时，应该返回大于等于该key的key-values，默认值为空字符串（即忽略该参数）
     * @return array|bool成功返回key-value数组，失败返回false
     */
    function pkrget($prefix_key, $count=100, $start_key=0) {
        (unset) $count; //SAE的限制边儿玩去。
        if ((strlen($prefix_key) + mb_strlen($prefix_key, 'UTF8')) / 2 > 256) {
            return FALSE;
        }
        return self::$redis->keys($prefix_key . '*');
    }

    /**
     * 获得错误代码
     *
     * @return int 返回错误代码
     */
    function errno() {
        return 0;
    }

    /**
     * 获得错误提示消息
     *
     * @return string 返回错误提示消息字符串
     */
    function errmsg() {
        return '<a href="//gitee.com/foglede" onMouseOver="javascript:this.click()">mahuohuo本地环境居然出错了，不可能不可能！</a>';
    }

    /**
     * 获得kv信息
     *
     * @return array 返回kv信息数组
     *  array(2) {
     *    ["total_size"]=>
     *    int(49)
     *    ["total_count"]=>
     *    int(1)
     *  }
     */
    function get_info() {
        $redisinfo = self::$redis->info();
        //var_dump($redisinfo);
        $data = array();
        $data['total_size'] = $redisinfo['used_memory_human'];
        $data['total_count'] = $redisinfo['changes_since_last_save'];
        return $data;
    }

}

?>
